var KoolProxy_defineProperty = function() {
	var p, q = Object.defineProperty;
	if ("function" == typeof WeakMap) p = WeakMap;
	else {
		var r = 0,
			t = function() {
				this.a = (r += Math.random()).toString()
			};
		t.prototype.set = function(a, b) {
			var d = a[this.a];
			d && d[0] === a ? d[1] = b : q(a, this.a, {
				value: [a, b],
				writable: !0
			});
			return this
		};
		t.prototype.get = function(a) {
			var b;
			return (b = a[this.a]) && b[0] === a ? b[1] : void 0
		};
		t.prototype.has = function(a) {
			var b = a[this.a];
			return b ? b[0] === a : !1
		};
		p = t
	}

	function u(a) {
		this.b = a;
		this.h = Object.create(null)
	}

	function v(a, b, d, e) {
		this.a = a;
		this.i = b;
		this.c = d;
		this.f = e
	}

	function w() {
		this.g = /^([^\\\.]|\\.)*?\./;
		this.j = /\\(.)/g;
		this.a = new p
	}

	function x(a, b) {
		var d = b.f;
		if (d && !("beforeGet" in d || "beforeSet" in d)) return z(d);
		var e = {
			get: function() {
				var c = b.f;
				c && c.beforeGet && c.beforeGet.call(this, b.a.b);
				a: if (c = b.g) c = A(c) ? c.value : c.get ? c.get.call(this) : void 0;
					else {
						c = b.a.b;
						if (b.i in c && (c = B(c), null !== c)) {
							var d = C.call(c, b.i);
							c = d ? d.call(this) : c[b.i];
							break a
						}
						c = void 0
					}(this === b.a.b || D.call(b.a.b, this)) && E(a, c, b.c);
				return c
			},
			set: function(c) {
				if (this === b.a.b || D.call(b.a.b, this)) {
					b.f && b.f.beforeSet && (c = b.f.beforeSet.call(this, c, this));
					var d = b.g;
					d && A(d) && d.value === c ? c = !0 : (d = F(b, c, this), G(c) && (c = H(a, c), I(a, c, b.c)), c = d)
				} else c = F(b, c, this);
				return c
			}
		};
		d && J(d, e, K);
		return e
	}

	function I(a, b, d) {
		for (var e in d.h) {
			var c = d.h[e];
			if (b.h[e]) {
				var h = a,
					g = b.h[e],
					k = c;
				!k.f || g.f || "undefined" === typeof g.a.b || g.g || (g.g = z(k.f));
				g.c && k.c && g.c !== k.c && I(h, g.c, k.c)
			} else {
				g = h = void 0;
				k = a;
				var f = b,
					l = c.i,
					m = "undefined" !== typeof f.b,
					y = !1;
				m && (g = L(f.b, l)) && !g.configurable && (y = !0, h = f.b[l]);
				var n = y ? H(k, h) : new u(c.c.b);
				I(k, n, c.c);
				n = new v(f, l, n, c.f);
				f.h[l] = n;
				m && (n.g = g, m = x(k, n), y ? E(k, h, c.c) : (q(f.b, l, m), g && A(g) && (M(m, g.value, f.b), E(k, g.value, c.c))))
			}
		}
	}

	function E(a, b, d) {
		G(b) && (b = H(a, b), I(a, b, d))
	}

	function F(a, b, d) {
		var e = a.g;
		if (!e) {
			e = B(a.a.b);
			if (null !== e && (e = N.call(e, a.i))) return e.call(d, b);
			if (!O(a.a.b)) return !1;
			a.g = {
				value: b,
				configurable: !0,
				writable: !0,
				enumerable: !0
			};
			return !0
		}
		return M(e, b, d)
	}

	function H(a, b) {
		var d = a.a.get(b);
		d || (d = new u(b), a.a.set(b, d));
		return d
	}

	function A(a) {
		return "undefined" !== typeof a.writable
	}

	function J(a, b, d) {
		for (var e = 0, c = d.length; e < c; e++) {
			var h = d[e];
			h in a && (b[h] = a[h])
		}
	}

	function z(a) {
		if (a) {
			var b = {};
			J(a, b, P);
			return b
		}
	}

	function M(a, b, d) {
		if (A(a)) return a.writable ? (a.value = b, !0) : !1;
		if (!a.set) return !1;
		a.set.call(d, b);
		return !0
	}
	var P = "configurable enumerable value get set writable".split(" "),
		K = P.slice(0, 2),
		L = Object.getOwnPropertyDescriptor,
		O = Object.isExtensible,
		B = Object.getPrototypeOf,
		D = Object.prototype.isPrototypeOf,
		C = Object.prototype.__lookupGetter__ || function(a) {
			return (a = Q(this, a)) && a.get ? a.get : void 0
		},
		N = Object.prototype.__lookupSetter__ || function(a) {
			return (a = Q(this, a)) && a.set ? a.set : void 0
		};

	function Q(a, b) {
		if (b in a) {
			for (; !w.hasOwnProperty.call(a, b);) a = B(a);
			return L(a, b)
		}
	}

	function G(a) {
		var b = typeof a;
		return "function" === b || "object" === b && null !== a ? !0 : !1
	}
	var R;
	return function(a, b, d) {
		R || (R = new w);
		var e = R;
		d = d || window;
		var c = new u;
		a += ".";
		var h = c || new u;
		for (var g = e.g, k = e.j, f, l, m; a;) {
			f = g.exec(a);
			if (null === f) throw 1;
			f = f[0].length;
			l = a.slice(0, f - 1).replace(k, "$1");
			a = a.slice(f);
			(f = h.h[l]) ? m = f.c: (m = new u, f = new v(h, l, m), h.h[l] = f);
			h = m
		}
		if (!f) throw 1;
		a = f;
		a.f = b;
		E(e, d, c)
	};
}();